package gray;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class GrayHitExample {

    //灰度比例,取值范围是0到1之间
    static final double rate = 0.4;
    //灰度参考值
    static final String user = "my-user-name";

    //灰度算法
    public static void main(String[] args) {
        //灰度比例放大成 0 到 4096 之间
        int intRate = (int) (rate * 4096);
        try {
            //计算md5
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(user.getBytes(StandardCharsets.UTF_8));
            //取前12个bit
            //计算之前发现结果是int。先进行转换然后再运算,为了保证转换结果数值不变，所以计算机在正数前边补0负数补1，所以用 digest[0] & 0xFF 去掉前边的补位
            int r = (((int)digest[0] & 0xFF) << 4) | ((digest[1]&0xF0) >> 4);
            System.out.println("r=" + r + ", intRate="+ intRate);
            //因为md5值均匀且固定，所以用于灰度计算
            if(r < intRate){
                System.out.print("gray hit");
            }else{
                System.out.print("gray pass");
            }
        } catch (NoSuchAlgorithmException e) {
            System.out.println("++++ no md5 algorithm found");
        }
    }
}